//
// Created by robin on 4/7/16.
//

#ifndef SQLITETEST_CONTENTVALUES_H
#define SQLITETEST_CONTENTVALUES_H

#include <iostream>
#include <string>
#include <map>
#include <cstdint>
#include "DataType.h"

using std::string;
using std::map;

namespace duomai {
    namespace im {

        typedef union {
            int INT;
            int NUL;
            const char* TEXT;
            float FLOAT;
        } Data;

        class Value {
        public:
            Value(DataType data_type, Data data) {
                m_DataType = data_type;
                switch (m_DataType) {
                    case SQLITEWRAPPER_INTEGER :
                        m_Data.INT = data.INT;
                        break;
                    case SQLITEWRAPPER_NULL:
                        m_Data.NUL = data.NUL;
                        break;
                    case SQLITEWRAPPER_TEXT:
                        m_Data.TEXT = data.TEXT;
                    case SQLITEWRAPPER_FLOAT:
                        m_Data.FLOAT = data.FLOAT;
                        break;
                    default:
                        m_Data.NUL = data.NUL;
                        break;
                }
            }

            DataType getType() {
                return m_DataType;
            }

            Data getData() {
                return m_Data;
            }

        private:
            DataType m_DataType;
            Data m_Data;
        };

        class ContentValues {
        public:
            ContentValues();
            ~ContentValues();
            void put(string key, int value);
            void put(string key, int64_t value);
            void put(string key, string value);
            void put(string key, float value);
            void putNULL(string key);

            string toString();
            template< typename T >
            string to_string( const T& n );


        private:
            map<string, Value> values;
        };

    }
}

#endif //SQLITETEST_CONTENTVALUES_H
